# coding=utf-8
from selenium import webdriver
from selenium.webdriver import ChromeOptions
import time
import sys, os
from PIL import Image, ImageDraw
import pytesseract
from selenium.webdriver.common.keys import Keys
import xlwt
import xlrd
import copy
from xlutils.copy import copy


# 把图片的非黑色全部换成黑色
def outColor(path):
    img = Image.open(path)
    w, h = img.size
    for x in range(w):
        for y in range(h):
            r, g, b = img.getpixel((x, y))
            if 190 <= r <= 255 and 170 <= g <= 255 and 0 <= b <= 140:
                img.putpixel((x, y), (0, 0, 0))
            if 0 <= r <= 90 and 210 <= g <= 255 and 0 <= b <= 90:
                img.putpixel((x, y), (0, 0, 0))
    img = img.convert('L').point([0] * 150 + [1] * (256 - 150), '1')
    return img


# 识别图片中的文字
def recognize_captcha(img_path):
    im = Image.open(img_path)
    num = pytesseract.image_to_string(im)
    return num


# 验证码处理过程封装
def qrcode_go(browser, id, name, search_date):
    print('开始处理验证码')
    # 截取当前网页并放到D盘下命名为printscreen，该网页有我们需要的验证码
    browser.save_screenshot('printscreen.png')
    # 通过验证码输入框的id去获取其哥哥元素
    imgelement = browser.find_element_by_xpath("//input[@id='validateNum']/preceding-sibling::img[1]")
    # 获取验证码x,y轴坐标
    location = imgelement.location
    # print(location)
    # 获取验证码的长宽
    size = imgelement.size
    # print(size)
    rangle = (int(location['x'] - 5), int(location['y'] - 5), int(location['x'] + size['width'] + 5),
              int(location['y'] + size['height'] + 5))  # 写成我们需要截取的位置坐标
    i = Image.open("printscreen.png")  # 打开截图
    frame4 = i.crop(rangle)  # 使用Image的crop函数，从截图中再次截取我们需要的区域
    frame4 = frame4.convert('RGB')
    frame4.save('code.jpg')  # 保存我们接下来的验证码图片 进行打码
    # 去色处理
    im = outColor('code.jpg')
    # 重新保存
    im.save('codeBlack.png')
    # 识别
    codeNum = recognize_captcha('codeBlack.png')
    strs = codeNum.split("\n")
    code_to = strs[0]
    code_to.replace(' ', '')
    print('验证码为：' + code_to)
    # 赋值二维码
    if code_to == '' or len(code_to) != 5:
        print('识别验证码不符合要求，重新执行')
        openUrl(browser, id, name, search_date)
        return
    browser.find_element_by_id("validateNum").send_keys(code_to)
    time.sleep(1)
    # 点击登录
    # 查找弟弟节点--离自己节点最近的input弟弟节点
    # print(
    #     browser.find_element_by_xpath("//input[@id='validateNum']/following-sibling::input[1]").get_attribute('value'))
    try:
        browser.find_element_by_xpath("//input[@id='validateNum']/following-sibling::input[1]").click()
    except IOError:
        print("click出错一次 继续执行")
        qrcode_go(browser, id, name, search_date)
        return
    # 获取验证码提示错误位置的值，如果有提示验证码输入错误则
    td = browser.find_elements_by_css_selector("font")
    # error_message = browser.find_elements_by_css_selector('message')
    fontLen = len(td)
    print('大于等于2时验证码不正确:' + str(fontLen))
    # print('输入验证码:' + str(is_exists_element('message')))
    # print(len(error_message))
    if fontLen >= 2:
        # 验证码不正确，再次调用
        qrcode_go(browser, id, name, search_date)
    else:
        # 验证码正确了那么重新定位当前浏览器页面元素
        time.sleep(1)
        # browser.switch_to.window(driver.window_handles[0])
        # 执行JS脚本 野蛮处理
        try:
            browser.execute_script("chaxun('033'," + search_date + ")")
        except ERROR:
            time.sleep(3)
            browser.execute_script("chaxun('033'," + search_date + ")")

        print('开始获取数据033' + search_date)
        # 获取表格数据
        # table_list = []
        time.sleep(1)
        browser.switch_to.window(browser.window_handles[0])
        td_list = browser.find_elements_by_css_selector('td')
        # trlen = len(td_list)
        # print(trlen)
        td_text = []
        # all_text = []
        for td in td_list:
            # 直接循环td获取文字
            text = td.get_attribute('textContent')
            if '名' not in text and '码' not in text and '未' not in text:
                #and '法' not in text and '理' not in text and '术' not in text and '析' not in text
                # 全部存入防止信息错乱
                td_text.append(text)
        # print(td_text)
        # # 笨办法补全一下 懒得写了
        # if len(td_text) == 2:
        #     td_text.append('无信息')
        #     td_text.append('无信息')
        #     td_text.append('无信息')
        #     td_text.append('无信息')
        # elif len(td_text) == 3:
        #     td_text.append('无信息')
        #     td_text.append('无信息')
        #     td_text.append('无信息')
        # elif len(td_text) == 4:
        #     td_text.append('无信息')
        #     td_text.append('无信息')
        # elif len(td_text) == 5:
        #     td_text.append('无信息')
        if len(td_text) < 10:
            for j in range(0, 10 - len(td_text)):
                td_text.append('无信息')

        td_text.append(search_date)
        # all_text.append(td_text)
        # path = 'sjcj.xls'
        # 追加写入到excel中
        # 返回一个人的数据
        print('开始返回数据' + td_text[0])
        return td_text
        # write_bool = write_excel_xls_append(path, all_text)
        # if write_bool:
        #     # 关闭当前页
        #     # browser.close()
        #     return True


'''
 zjhm： 身份证号
 ksxm： 姓名
 search_date = '201409'
'''


def openUrl(browser, zjhm, ksxm, search_date):
    print('openUrl()开始输入地址')
    # 执行打开地址和输入名字
    # 打开浏览器后输入这个网址
    browser.get('http://zgcjcx.cpta.com.cn/examfront/bscore!initializeCX.action')
    # browser.get('http://zgcjcx.cpta.com.cn/examfront/bscore!query_new.action')
    # 防止输入过快等候3秒再输入身份证号
    time.sleep(2)
    browser.find_element_by_id("zjhm").send_keys(zjhm)
    # 防止输入过快等候3秒再输入姓名
    time.sleep(1)
    browser.find_element_by_id("ksxm").send_keys(ksxm)
    # 防止输入过快等候3秒再开始处理验证码
    # time.sleep(2)
    # 调用验证码识别和输入并验证
    try:
        gogogo = qrcode_go(browser, zjhm, ksxm, search_date)
    except ERROR:
        gogogo = qrcode_go(browser, zjhm, ksxm, search_date)
    if gogogo:
        # 关闭当前页
        #返回一个人的数据
        return gogogo


# browser.find_element_by_xpath("//input[@id='validateNum']/following-sibling::input[1]").send_keys(Keys.ENTER)
# 关闭浏览器
# browser.quit()

# 追加写入
def write_excel_xls_append(path, value):
    # 获取需要写入数据的行数
    index = len(value)
    print('write_excel_xls_append(path, value)开始写入数据：行数：' + str(index))
    if index == 0:
        print('没有可写入的数据')
        return
    workbook = xlrd.open_workbook(path)  # 打开工作簿
    sheets = workbook.sheet_names()  # 获取工作簿中的所有表格
    worksheet = workbook.sheet_by_name(sheets[0])  # 获取工作簿中所有表格中的的第一个表格
    rows_old = worksheet.nrows  # 获取表格中已存在的数据的行数
    new_workbook = copy(workbook)  # 将xlrd对象拷贝转化为xlwt对象
    new_worksheet = new_workbook.get_sheet(0)  # 获取转化后工作簿中的第一个表格
    for i in range(0, index):
        for j in range(0, len(value[i])):
            new_worksheet.write(i + rows_old, j, value[i][j])  # 追加写入数据，注意是从i+rows_old行开始写入
    new_workbook.save(path)  # 保存工作簿
    print("xls格式表格【追加】写入数据成功！")


def is_exists_element(css):
    global browser
    s = browser.find_elements_by_css_selector(css)
    if len(s) == 0:
        return False
    else:
        return True


# 浏览器设置
options = webdriver.FirefoxOptions()
# 设置中文
# options.add_argument('lang=zh_CN.UTF-8')
# #开启selenium的开发者调试模式功能性参数可以防止selenium被检测屏蔽
# options.add_experimental_option('excludeSwitches', ['enable-automation'])  # 以键值对的形式加入参数
# 更换头部
ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 ' \
     'Safari/537.36 '

ua = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0'

options.add_argument('user-agent="%s"' % ua)
# 定义需要查询的日期
# search_date = '201409'
location = 'C:\\Program Files\\Mozilla Firefox\\firefox.exe'
# 设置浏览器请求头并启动火狐浏览器，谷歌请用ChromeDrvier
print('开始启动浏览器')
browser = webdriver.Firefox(firefox_binary=location)
# 浏览器最大化窗口
browser.maximize_window()
#这是需要查询的日期
chaxun_date = ['201409', '201509', '201710', '201810']
#这个是需要查询的数据清单
chaxun_from_path = 'chaxun.xls'
# for循环获取excel表中的数据
book = xlrd.open_workbook(chaxun_from_path)
sheet1 = book.sheets()[0]
# 总行数
total_rows = sheet1.nrows
print('开始读取XLS表-查询总行数：' + str(total_rows))
# 查询第二行第二列
# print(sheet1.row_values(1)[1])
# 查询第二行第三列
# print(sheet1.row_values(1)[2])
for item in chaxun_date:
    print('开始读取日期数据：' + item)
    errorInfo = []
    errorsInfo = []
    one_date_data = []
    for i in range(0, total_rows):
        if sheet1.row_values(i)[1] != '' and sheet1.row_values(i)[2] != '':
            # 返回了一个人在一个日期的数据
            try:
                one_people_date_data = openUrl(browser, sheet1.row_values(i)[1], sheet1.row_values(i)[2], item)
                # 查完一轮日期的数据后再存到表中
                one_date_data.append(one_people_date_data)
            except ERROR:
                #野蛮处理出错后从新执行
                one_people_date_data = openUrl(browser, sheet1.row_values(i)[1], sheet1.row_values(i)[2], item)
                # 查完一轮日期的数据后再存到表中
                one_date_data.append(one_people_date_data)
        else:
            errorInfo.append(sheet1.row_values(i)[1])
            errorInfo.append(sheet1.row_values(i)[2])
            errorsInfo.append(errorInfo)
    write_excel_xls_append(item + '.xls', one_date_data)
    write_excel_xls_append(item + '.xls', errorsInfo)
# openUrl(browser, '110221197312010612', '纪飞' ,'201409')
browser.close()
print('完成')
